#include <iostream>
#include <string>
#include "user.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"

class UserService : public zlk::UserServiceRpc//想要用rpc，必须继承rpc的方法 在provider中框架进行绑定
{
public:

    bool Login(std::string name, std::string pwd)
    {
        std::cout << "doing local service Login" << std::endl;
        std::cout << "name:" << name << " pwd:" << pwd << std::endl;
        return true;
    }

    void Login(::google::protobuf::RpcController* controller,
               const ::zlk::LoginRequest* request,
               ::zlk::LoginResponse* response,
               ::google::protobuf::Closure* done)
            {
                //这个等于说是被框架调用的远程业务
                std::string name=request->name();
                std::string pwd=request->pwd();
                
                //获得框架远程调用方传递的参数 调用本地业务
                bool login_result= Login(name, pwd);
            
                //把响应写入 包括错误码 错误信息 返回值
                zlk::ResultCode* code=response->mutable_result();
                code->set_errcode(0);
                code->set_errmsg("");
                response->set_sucess(login_result);

                //执行回调操作 响应数据序列化以及网络发送 都是框架实现的
                done->Run();
            }
};

int main(int argc, char **argv)
{
    MprpcApplication::Init(argc, argv);

    // provider是一个rpc网络服务对象，把
    //  创建RpcProvider实例
    RpcProvider provider;

    // 注册UserService服务到RpcProvider
    // 这里通过NotifyService方法通知RpcProvider有新的服务加入
    // 参数是新创建的UserService实例
    provider.NotifyService(new UserService());

    // 启动RpcProvider
    // Run方法负责启动RpcProvider，使其开始监听和处理请求
    provider.Run();

    return 0;
}